package com.wy.util;

import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.nio.file.Files;
import java.security.DigestInputStream;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

public class Md5 {

    /**
     * 计算文件的 MD5 值
     *
     * @param file 要计算 MD5 值的文件
     * @return 文件的 MD5 值（十六进制字符串）
     * @throws IOException 如果文件读取过程中发生错误
     * @throws NoSuchAlgorithmException 如果 MD5 算法不可用
     */
    public static String calculateMD5(File file) throws IOException, NoSuchAlgorithmException {
        MessageDigest md = MessageDigest.getInstance("MD5");
        try (DigestInputStream dis = new DigestInputStream(Files.newInputStream(file.toPath()), md)) {
            // 读取文件内容以计算 MD5
            byte[] buffer = new byte[8192]; // 使用缓冲区提高读取效率
            while (dis.read(buffer) != -1) {
                // 读取文件内容，DigestInputStream 会自动更新 MD5 值
            }
        }
        byte[] digest = md.digest();
        return bytesToHex(digest);
    }

    /**
     * 将字节数组转换为十六进制字符串
     *
     * @param bytes 字节数组
     * @return 十六进制字符串
     */
    private static String bytesToHex(byte[] bytes) {
        StringBuilder sb = new StringBuilder();
        for (byte b : bytes) {
            sb.append(String.format("%02x", b));
        }
        return sb.toString();
    }
}
